package template;

/**
 * 模板方法：定义算法骨架
 *
 * @author Liu Yicong
 * @date 2025/9/25
 */
public abstract class Game {

	// 模板方法，使用 final 确保算法骨架不变
	public final void play() {
		String gameName = getName();

		// 1. 启动游戏（具体操作 - 不变）
		initialize();

		// 2. 运行游戏主体（抽象操作 - 变化）
		startPlay();

		// 3. 检查是否需要显示帮助信息（钩子方法 - 可选）
		if (needShowHelp()) {
			showHelp();
		}

		// 4. 结束游戏（抽象操作 - 变化）
		endPlay();
	}

	// 具体操作：算法中不变的部分
	private void initialize() {
		System.out.println(getName() + "游戏初始化中...");
	}

	protected abstract String getName();

	// 抽象操作：必须由子类实现的部分
	protected abstract void startPlay();

	protected abstract void endPlay();

	// 钩子方法：默认不显示帮助，子类可重写
	protected boolean needShowHelp() {
		return false;
	}

	// 钩子方法：默认空实现，子类可插入自定义行为
	protected void showHelp() {
		System.out.println("（父类默认：显示游戏帮助）");
	}

}
